【 JUC锁机制 】
➣ JUC锁机制包括有如下组成部分:
➣ 核心接口:Lock、ReadWriteLock;
➣ AQS抽象类:
• AbstractOwnableSynchronizer(排它锁) ;
AbstractQueuedSynchronizer(为实现依赖于先进先出FIFO等待队列的阻塞锁和相关
同步器<信号量、事件,等>提供一个框架) ;
• AbstractQueuedLongSynchronizer(64位同步器)
➣ 工具类:ReentrantLock互斥锁、ReadWriteLock读写锁、Condition控制队列、
LockSupport阻塞原语、Semaphore信号量、CountDownLatch闭锁、
CyclicBarrier栅栏、Exchanger交换机、CompletableFuture线程回掉;
【 juc锁机制(java.util.concurrent.locks)】
之前给出的接口和类只是所有锁的父类,那么会根据实际的使用不同juc的锁机制里面提供有如下的几个常用的锁处理类: ReentrantLock互斥锁、ReadWriteLock读写锁、Condition控制队列、LockSupport阻塞原语、
Semaphore信号量、CountDownLatch闭锁、CyelicBarrier栅栏、
Exchanger 交换机、CompletableFuture线程回调;
之所以在juc里面要重新提供有一系列的锁的处理工具类,其根本的原因在于,java原始的锁机制(synchronized)虽然可以提供有数据的安全访问机制,但是其缺点也是非常明显的,所有的线程对象只能够享受一把锁。
【 java.util.concurrent锁概览 】
➣ java.util.concurrent.lock提供了锁的基础支持;
➣ Lock接口:支持语义不同(冲入、公平等)的锁规则。
➣ 所谓语义不同,是指锁可是有”公平机制的锁”、”非公平机制的锁”、”可重入的锁”等等;
• “公平机制” :指 “不同线程获取锁的机制是公平的” ;
• “非公平机制” : 指 “不同线程获取锁的机制是非公平的” ;
• “可重入的锁” : 指 同一个锁能够被一个线程多次获取,可重入锁最大的作用是避免死锁。
➣ ReadWriteLock 接口以和Lock类似的方式定义了一些读取者可以共享而写入者独占的锁。
➣ Condition:接口描述了可能会与锁有关联的条件变量(Object类中的wait()方法使用类似)。
【 公平锁核心概念 】
➣ AbstractQueuedSynchronizer:是java中管理“ 锁”的抽象类,锁的许多公共方法都
是在这个类中实现。AbstractQueuedSynchronizer是独占锁(例如,ReentrantLock)
➣ AbstractQueuedSynchronizer类别:
➣ 独占锁:锁在一个时间点只能被一个线程锁占有,根据锁的获取机制,它又
划分为“公平锁”和“非公平锁”。公平锁,是按照通过CLH等待线程按照先
来先得的规则,公平的获取锁;而非公平锁,则当线程要获取锁时,它会
无视CLH等待队列而直接获取锁。
➣ 共享锁:能被多个线程同时拥有,能被共享的锁;
➣ CLH队列(Craig,Landin,and Hagersten locks):CLH锁也是一种基于链表的可扩展、
高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮训前驱的状态,如果
发现前驱释放了锁就结束子旋。
➣ CAS方法(Compare And Swap):比较并交换方法,它是原子操作方法;即,通过CAS操作的数据都是以原子方式进行的。
【 CLH锁 ---- 解决死锁问题 】
【 独占锁:ReentrantLock 】
➣ ReentrantLock是一个可重入的互斥锁,又被称为”独占锁”。
➣ ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,
ReentrantLock锁,可以被单个线程多次获取。
➣ ReentrantLock分为”公平锁”和“非公平锁”。它们的区别体现在获取锁的机制
上是否公平以及执行速度上。
➣ ReentrantLock是通过一个FIFO的等待队列来管理获取该锁所有线程的。
ReentrantLock是一个独占锁,在获取锁的之后其所有的操作是线程独享的,其它的线程在没有获取到锁之前都需要进行等待。
public class ReentrantLock
class Object
implements Lock, Serializa